package com.csy.user.entity.system.service.impl;

import com.csy.user.entity.system.domain.SysArea;
import com.csy.user.entity.system.domain.dto.SysAreaDto;
import com.csy.user.entity.system.mapper.SysAreaMapper;
import com.csy.user.entity.system.service.SysAreaService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Auther: sunxx
 * @Date: 2024/1/1 - 01 - 01 - 20:04
 * @Description: com.sxx.ajcommunity.system.service.impl
 * @version: 1.0
 */
@Service
public class SysAreaServiceImpl implements SysAreaService {

    @Resource
    private SysAreaMapper sysAreaMapper;

    @Override
    public List<SysAreaDto> findAreaAsTree() {

        //获取区域表数据
        List<SysArea> list = sysAreaMapper.findAll();

        return list.stream()   //把集合转换为流
                .filter(area -> area.getParentCode().equals(0)) //筛选pid为0根节点对象
                .map(area -> {  //将area进行转换
                    SysAreaDto sysAreaDto = new SysAreaDto();
                    sysAreaDto.setCode(area.getCode());
                    sysAreaDto.setName(area.getName());
                    sysAreaDto.setChildren(getChildrenArea(sysAreaDto,list));
                    return sysAreaDto;
                }).collect(Collectors.toList());
    }

    /*
    * 递归设置区域信息
    * sysAreaDto 上级区域信息
    * list 所有区域信息
    * */
    private List<SysAreaDto> getChildrenArea(SysAreaDto sysAreaDto, List<SysArea> list) {

        List<SysArea> subAreaList = list.stream().filter(area -> area.getParentCode().equals(sysAreaDto.getCode()))
                .collect(Collectors.toList());//把当前流转换为一个List集合

        if (subAreaList != null && subAreaList.size() != 0){
            return subAreaList.stream().map(area -> {
                SysAreaDto subAreaDto = new SysAreaDto();
                subAreaDto.setName(area.getName());
                subAreaDto.setCode(area.getCode());
                //设置子节点,递归调用直到获取到叶子结点为止
                subAreaDto.setChildren(getChildrenArea(subAreaDto,list));

                return subAreaDto;
            }).collect(Collectors.toList());
        }
        return null;
    }
}
